너는 다변량통계, 판별분석, 머신러닝 분류모형 및 Python 데이터 분석을 수행하는
전문 데이터 분석가이자 대학 교육 전문가이다.

첨부한 CSV 또는 Excel 데이터는 참가자의 인구통계 특성, MBTI 성향점수,
파생 성향변수 및 최종 MBTI 유형을 포함한 자료이다.

본 분석의 목적은 성향점수를 이용하여 MBTI 16개 유형을 예측하고,
선형판별분석(Linear Discriminant Analysis, LDA)과
이차판별분석(Quadratic Discriminant Analysis, QDA)의 성능을 비교하는 것이다.

중요: 분석을 설명하거나 Python 코드만 제시하고 종료하지 마라.
반드시 전체 Python 코드를 작성한 후 Python 실행 환경에서 실제로 실행하고,
실행된 결과를 확인한 뒤 그 결과만을 근거로 해석하여라.

가상의 Accuracy, p값, 혼동행렬, 최적 모형 또는 예시 결과를 작성하지 마라.
코드를 실행하지 못한 경우 결과를 추정하지 말고 실행하지 못한 이유를 명확히 밝혀라.

────────────────────────────────────
1. 데이터 변수
────────────────────────────────────

데이터의 예상 변수는 다음과 같다.

식별변수:

- Participant_ID

인구통계 변수:

- Age
- Gender

MBTI 원점수 변수:

- Social_Energy
- Reflection_Time
- Sensing_Detail
- Intuition_Vision
- Logic_Score
- Empathy_Score
- Structure_Preference
- Spontaneity

파생 성향변수:

- Teamwork_Preference
- Creativity_Score
- Decision_Speed
- Planning_Habit

목표변수:

- MBTI

각 원점수의 의미는 다음과 같다.

- Social_Energy: 사람들과 어울릴 때의 에너지 및 활동성, E 성향
- Reflection_Time: 혼자 생각하고 성찰하는 시간 선호, I 성향
- Sensing_Detail: 구체적 사실·경험·세부정보 중시, S 성향
- Intuition_Vision: 아이디어·가능성·미래지향적 사고, N 성향
- Logic_Score: 논리·객관 기준 중심 의사결정, T 성향
- Empathy_Score: 타인의 감정과 관계를 고려하는 성향, F 성향
- Structure_Preference: 계획·조직·체계 선호, J 성향
- Spontaneity: 즉흥성·유연성·상황 대응 성향, P 성향

파생변수의 예상 관계는 다음과 같다.

- Teamwork_Preference: E 및 F 성향과 관련
- Creativity_Score: N 및 P 성향과 관련
- Decision_Speed: E 및 T 성향과 관련
- Planning_Habit: J 및 I 성향과 관련

실제 데이터의 변수명이 예상 변수명과 다르면
앞뒤 공백, 대소문자, 특수문자 및 유사한 변수명을 확인하여 대응시켜라.

존재하지 않는 변수를 임의로 생성하지 마라.

────────────────────────────────────
2. 분석 목적과 연구 질문
────────────────────────────────────

다음 연구 질문에 답하여라.

1. 성향점수를 이용하여 MBTI 16개 유형을 어느 정도 정확하게 분류할 수 있는가?
2. LDA와 QDA 중 어느 모형의 예측성능이 더 우수한가?
3. 파생 성향변수 4개를 추가하면 분류성능이 향상되는가?
4. Age와 Gender를 추가하면 예측력이 개선되는가?
5. 어떤 MBTI 유형이 잘 분류되고 어떤 유형이 자주 혼동되는가?
6. E/I, S/N, T/F, J/P 중 어느 MBTI 축이 가장 잘 구분되는가?
7. QDA의 비선형 결정경계가 LDA보다 유의한 성능 향상을 제공하는가?
8. 가장 단순하면서도 재현성과 일반화 성능이 우수한 최종 모형은 무엇인가?

────────────────────────────────────
3. 분석모형 구성
────────────────────────────────────

다음 세 가지 변수구성을 비교하여라.

[모형 A: 기본 성향점수 모형]

다음 8개 원점수만 사용한다.

- Social_Energy
- Reflection_Time
- Sensing_Detail
- Intuition_Vision
- Logic_Score
- Empathy_Score
- Structure_Preference
- Spontaneity

[모형 B: 확장 성향점수 모형]

다음 12개 변수를 사용한다.

- 기본 성향점수 8개
- Teamwork_Preference
- Creativity_Score
- Decision_Speed
- Planning_Habit

[모형 C: 전체 확장모형]

다음 변수를 사용한다.

- 기본 성향점수 8개
- 파생 성향변수 4개
- Age
- Gender

다음 변수는 모든 판별분석 입력에서 제외하여라.

- Participant_ID
- MBTI

Participant_ID는 식별자이므로 예측변수에서는 제외하되,
최종 예측결과표에는 다시 결합하여라.

────────────────────────────────────
4. 정보 누수와 파생변수 점검
────────────────────────────────────

분석 전에 다음 사항을 반드시 점검하여라.

1. 파생변수 4개가 원점수 변수의 합, 평균, 선형결합 또는 규칙 기반으로 생성되었는지 확인한다.
2. MBTI가 원점수의 임계값 또는 일정한 규칙으로 생성되었는지 탐색한다.
3. MBTI가 원점수로 기계적으로 생성된 경우,
   분석이 심리적 유형을 예측하는 문제가 아니라 생성규칙을 재현하는 분석일 수 있음을 설명한다.
4. 원점수와 파생변수를 동시에 투입하면 정보중복과 다중공선성이 발생할 수 있음을 점검한다.
5. 파생변수를 포함한 모형이 단순히 중복정보 때문에 성능이 높아지는지 검토한다.
6. Age와 Gender가 분류성능을 높이더라도 편향과 일반화 문제를 검토한다.

다음 변수쌍의 상관관계를 우선 확인하여라.

- Social_Energy ↔ Reflection_Time
- Sensing_Detail ↔ Intuition_Vision
- Logic_Score ↔ Empathy_Score
- Structure_Preference ↔ Spontaneity
- 각 원점수 ↔ 파생변수

절대상관계수가 0.90 이상인 변수쌍이 있으면
정보중복, 선형종속 및 공분산행렬 불안정 가능성을 설명하여라.

────────────────────────────────────
5. 데이터 불러오기
────────────────────────────────────

첨부된 CSV 또는 Excel 파일을 Python으로 직접 불러와라.

다음 절차를 수행하여라.

1. 실행환경의 업로드 또는 작업 폴더에서 CSV와 Excel 파일을 탐색한다.
2. 파일이 한 개이면 해당 파일을 분석한다.
3. 파일이 여러 개이면 후보 파일명을 출력하고,
   필수 변수의 존재 여부를 기준으로 가장 적합한 파일을 선택한다.
4. CSV 인코딩 오류가 발생하면 utf-8, utf-8-sig, cp949, euc-kr 등을 순차적으로 확인한다.
5. Excel 파일이면 적절한 sheet를 확인한다.
6. 변수명 앞뒤 공백과 불필요한 특수문자를 정리한다.

다음을 출력하여라.

- 선택한 파일명
- 선택한 sheet명
- 전체 행 수와 열 수
- 전체 변수명
- 데이터 앞부분 5행
- 변수별 자료형
- 수치형 변수와 범주형 변수
- 분석에 필요한 필수 변수 존재 여부

────────────────────────────────────
6. 데이터 품질 점검
────────────────────────────────────

다음을 점검하고 표로 제시하여라.

- 변수별 결측치 개수
- 변수별 결측치 비율
- 중복 행 개수
- Participant_ID 중복 개수
- 무한대 값 개수
- 수치형 변환 실패 개수
- 분석 전 표본 수
- 최종 분석 표본 수

수치형 변수에 대해 다음 기술통계를 제시하여라.

- 표본 수
- 평균
- 표준편차
- 중앙값
- 최솟값
- 최댓값
- 1사분위수
- 3사분위수
- 왜도
- 첨도

다음 그래프를 작성하여라.

- 변수별 histogram
- 변수별 boxplot
- 상관계수 heatmap

이상치는 자동으로 제거하지 마라.

다음을 구분하여 판단하여라.

- 입력 오류
- 측정 오류
- 실제 극단적인 성향값

오류라는 명확한 근거가 없으면 이상치를 유지하고,
필요하면 이상치 포함 결과와 제외 결과를 민감도 분석으로 비교하여라.

────────────────────────────────────
7. MBTI 목표변수 정리
────────────────────────────────────

MBTI 변수에 다음 처리를 적용하여라.

- 문자열로 변환
- 앞뒤 공백 제거
- 대문자로 통일

정상 MBTI 유형은 다음 16개이다.

- ISTJ, ISFJ, INFJ, INTJ
- ISTP, ISFP, INFP, INTP
- ESTP, ESFP, ENFP, ENTP
- ESTJ, ESFJ, ENFJ, ENTJ

다음을 확인하여라.

- 실제 MBTI 유형 수
- 유형별 표본 수
- 유형별 비율
- 존재하지 않는 MBTI 유형
- 잘못 입력된 MBTI 값
- MBTI 결측치
- 최소 클래스 표본 수
- 최대 클래스 표본 수
- 클래스 불균형비

MBTI 유형별 표본 수를 표와 막대그래프로 제시하여라.

잘못 입력된 유형은 임의로 수정하지 말고,
수정 가능한 명백한 공백·대소문자 문제만 처리하여라.

────────────────────────────────────
8. 표본 수 적절성 점검
────────────────────────────────────

300명 내외의 자료에서 MBTI 16개 유형을 분류하는 경우
유형당 평균 표본 수가 많지 않음을 고려하여라.

각 변수구성별 예측변수 수를 제시하고,
각 MBTI 클래스의 표본 수와 비교하여라.

특히 QDA는 각 클래스별 공분산행렬을 별도로 추정하므로
다음 조건을 확인하여라.

- 클래스별 표본 수가 예측변수 수보다 충분히 큰가?
- 공분산행렬이 full rank인가?
- singular matrix가 발생하는가?
- 변수 수 증가에 따라 QDA가 불안정해지는가?

표본 수가 부족한 경우 다음을 설명하여라.

- QDA의 과적합 가능성
- 정규화 QDA의 필요성
- 모형 A가 모형 B·C보다 안정적일 수 있는 이유
- Accuracy만으로 성능을 평가하면 안 되는 이유

────────────────────────────────────
9. 학습 데이터와 시험 데이터 분리
────────────────────────────────────

전체 데이터를 다음과 같이 분리하여라.

- 학습 데이터 80%
- 시험 데이터 20%
- random_state=42
- MBTI 기준 stratify 적용

동일한 train/test split을 모든 LDA, QDA 및 변수구성에 공통으로 사용하여라.

시험 데이터는 최종 모형 평가 전까지 모형 선택에 사용하지 마라.

특정 MBTI 클래스의 표본 수가 너무 적어 stratify가 불가능하면:

1. 오류 내용을 확인한다.
2. 시험 데이터 비율을 조정할 수 있는지 검토한다.
3. 반복 층화 교차검증 중심 평가로 전환한다.
4. 적용한 대안과 한계를 설명한다.

분리 후 다음을 제시하여라.

- 학습 표본 수
- 시험 표본 수
- 학습 데이터의 유형별 표본 수
- 시험 데이터의 유형별 표본 수
- 모든 클래스가 양쪽 데이터에 포함되었는지

────────────────────────────────────
10. 전처리
────────────────────────────────────

전처리는 반드시 scikit-learn Pipeline과 ColumnTransformer 내부에서 수행하여
데이터 누수를 방지하여라.

수치형 변수:

- 결측치는 학습 데이터의 중앙값으로 대체
- StandardScaler로 표준화

Gender:

- 결측치는 학습 데이터의 최빈값으로 대체
- OneHotEncoder 적용
- handle_unknown='ignore'
- 필요하면 drop='first'

전체 데이터에서 미리 중앙값, 최빈값 또는 평균을 계산하지 마라.

모든 imputer, encoder 및 scaler는
교차검증의 각 학습 fold 안에서만 적합되어야 한다.

────────────────────────────────────
11. LDA와 QDA의 가정 설명
────────────────────────────────────

다음 가정을 설명하여라.

[LDA]

- 종속변수는 범주형
- 예측변수는 연속형 또는 적절히 인코딩된 변수
- 클래스별 다변량 정규성
- 클래스별 공분산행렬 동일성
- 심각한 다중공선성 없음
- 관측값 독립성

[QDA]

- 종속변수는 범주형
- 클래스별 다변량 정규성
- 각 클래스별 서로 다른 공분산행렬 허용
- 각 클래스 공분산행렬 추정을 위한 충분한 표본 수
- 심각한 선형종속 없음

가정 위반 시 분석을 즉시 중단하지 말고,
교차검증 성능과 정규화 방법을 이용하여 탐색적으로 평가하여라.

────────────────────────────────────
12. 판별분석 가정 점검
────────────────────────────────────

다음을 실제 데이터로 점검하여라.

1. 정규성
   - 변수별 histogram
   - Q-Q plot
   - 필요하면 Shapiro–Wilk 검정
   - 다중검정과 표본 수에 따른 민감성 설명

2. 다중공선성
   - Pearson 상관계수
   - 상관 heatmap
   - VIF
   - 행렬 rank
   - 조건수

3. 클래스별 공분산행렬
   - 클래스별 공분산행렬 rank
   - determinant 또는 condition number
   - singular 여부

4. 공분산행렬 동일성
   - 가능한 경우 Box’s M 검정
   - 사용 패키지가 없으면 직접 구현하거나 탐색적 비교
   - Box’s M 검정이 정규성 위반에 민감함을 설명

5. 클래스별 표본 수
   - 최소 클래스 표본 수
   - 변수 수 대비 클래스 표본 수
   - QDA 추정 가능성

가정 위반 결과를 숨기지 말고,
LDA와 QDA의 성능 및 안정성 해석에 반영하여라.

────────────────────────────────────
13. 교차검증 설계
────────────────────────────────────

모형 선택은 학습 데이터에서만 수행하여라.

기본 교차검증은 다음과 같다.

- RepeatedStratifiedKFold
- n_splits=5
- n_repeats=5
- random_state=42

최소 클래스 표본 수가 5보다 작으면
n_splits를 최소 클래스 표본 수에 맞게 자동 조정하여라.

n_splits가 2보다 작아지면
16개 유형 분류의 신뢰성이 매우 낮음을 설명하여라.

모든 후보모형은 동일한 교차검증 분할을 사용하여 공정하게 비교하여라.

다음 평가지표를 계산하여라.

- Accuracy
- Balanced Accuracy
- Macro Precision
- Macro Recall
- Macro F1-score
- Weighted F1-score
- Negative Log Loss

각 평가값은 평균과 표준편차를 함께 제시하여라.

────────────────────────────────────
14. LDA 후보모형
────────────────────────────────────

각 변수구성 A, B, C에 대해 다음 LDA를 비교하여라.

[LDA 1: 기본 LDA]

LinearDiscriminantAnalysis(
    solver='svd'
)

[LDA 2: Shrinkage LDA]

LinearDiscriminantAnalysis(
    solver='lsqr',
    shrinkage='auto'
)

필요하면 다음도 검토할 수 있다.

LinearDiscriminantAnalysis(
    solver='eigen',
    shrinkage='auto'
)

지원되지 않는 solver와 shrinkage 조합을 사용하지 마라.

각 후보에 대해 다음을 기록하여라.

- 변수구성
- solver
- shrinkage
- CV Accuracy 평균과 표준편차
- CV Balanced Accuracy
- CV Macro F1
- CV Weighted F1
- CV Log Loss
- 학습 실패 또는 경고 여부

최적 LDA는 다음을 종합하여 선택하여라.

1. Macro F1-score
2. Accuracy
3. Balanced Accuracy
4. 교차검증 표준편차
5. 수치 안정성
6. 변수 수와 모형 단순성

────────────────────────────────────
15. QDA 후보모형
────────────────────────────────────

각 변수구성 A, B, C에 대해 QDA를 수행하여라.

다음 reg_param 후보를 비교하여라.

- 0.00
- 0.01
- 0.05
- 0.10
- 0.20
- 0.30
- 0.50
- 0.70
- 0.90

모형 예:

QuadraticDiscriminantAnalysis(
    reg_param=값,
    store_covariance=True
)

각 후보에 대해 다음을 기록하여라.

- 변수구성
- reg_param
- CV Accuracy
- CV Balanced Accuracy
- CV Macro F1
- CV Weighted F1
- CV Log Loss
- 공분산행렬 singular 여부
- Variables are collinear 경고
- NaN 또는 무한대 예측확률 발생 여부
- 학습 실패 여부

QDA 실행 중 오류나 경고가 발생하면 숨기지 말고
어떤 변수구성과 reg_param에서 발생했는지 보고하여라.

최적 QDA는 다음을 종합하여 선정하여라.

1. Macro F1-score
2. Accuracy
3. Balanced Accuracy
4. 수치 안정성
5. 교차검증 변동성
6. 과적합 가능성

────────────────────────────────────
16. 최적 LDA와 QDA 선정
────────────────────────────────────

학습 데이터의 교차검증 결과만 이용하여 다음을 확정하여라.

- Best LDA
- Best QDA

각 모형에 대해 다음을 제시하여라.

- 선택된 변수구성
- 선택된 solver 또는 reg_param
- 교차검증 Accuracy
- 교차검증 Macro F1
- 교차검증 Balanced Accuracy
- 교차검증 표준편차
- 선정 근거
- 제외된 다른 후보보다 우수한 이유

시험 데이터의 결과를 보고 후보모형을 다시 선택하지 마라.

────────────────────────────────────
17. 시험 데이터 최종 평가
────────────────────────────────────

Best LDA와 Best QDA를 전체 학습 데이터에 다시 학습한 후,
처음에 분리해 둔 시험 데이터에서 한 번만 최종 평가하여라.

각 모형에 대해 다음을 계산하여라.

- Accuracy
- Balanced Accuracy
- Macro Precision
- Macro Recall
- Macro F1-score
- Weighted F1-score
- Log Loss
- Top-2 Accuracy
- Top-3 Accuracy
- 정확하게 분류한 표본 수
- 오분류한 표본 수
- 시험 표본 수 N

Accuracy는 소수와 백분율을 함께 제시하여라.

예시 형식:

Accuracy = 0.7833, 즉 78.33%

위 숫자는 형식 예시일 뿐이며
실제 값은 Python 실행 결과로 산출하여라.

────────────────────────────────────
18. 혼동행렬
────────────────────────────────────

LDA와 QDA 각각에 대해 다음 혼동행렬을 작성하여라.

1. 실제 개수 기반 혼동행렬
2. 행 기준 정규화 혼동행렬

MBTI 유형의 순서는 가능한 경우 다음과 같이 고정하여라.

ISTJ, ISFJ, INFJ, INTJ,
ISTP, ISFP, INFP, INTP,
ESTP, ESFP, ENFP, ENTP,
ESTJ, ESFJ, ENFJ, ENTJ

실제 데이터에 없는 유형은 제외하거나 별도로 표시하여라.

혼동행렬에서 다음을 찾아라.

- 가장 잘 분류된 유형
- recall이 가장 낮은 유형
- 가장 자주 혼동된 유형쌍
- 특정 유형으로 과도하게 예측되는 경향
- LDA와 QDA의 오분류 패턴 차이

실제 결과를 확인하기 전에 특정 유형을 단정하지 마라.

────────────────────────────────────
19. 유형별 분류성능
────────────────────────────────────

LDA와 QDA 각각에 대해 classification report를 작성하여라.

각 MBTI 유형별로 다음을 제시하여라.

- Precision
- Recall
- F1-score
- Support

유형별 F1-score를 비교하는 그래프를 작성하여라.

표본 수가 적은 클래스는 F1-score가 불안정할 수 있음을 설명하여라.

────────────────────────────────────
20. MBTI 네 축별 정확도
────────────────────────────────────

16개 MBTI 유형 전체가 틀렸더라도
일부 성향축은 맞을 수 있으므로 각 글자 위치별 정확도를 계산하여라.

MBTI 문자열을 다음 네 축으로 분리하여라.

- 1번째 글자: E/I
- 2번째 글자: S/N
- 3번째 글자: T/F
- 4번째 글자: J/P

LDA와 QDA 각각에 대해 다음을 계산하여라.

- E/I 축 Accuracy
- S/N 축 Accuracy
- T/F 축 Accuracy
- J/P 축 Accuracy
- 네 축 모두 일치한 비율
- 4개 중 평균적으로 맞힌 축의 수
- 4개 중 3개 이상 맞힌 비율
- 4개 중 2개 이상 맞힌 비율

가장 잘 구분되는 축과 가장 어려운 축을 해석하여라.

────────────────────────────────────
21. 예측확률과 불확실성
────────────────────────────────────

LDA와 QDA의 predict_proba 결과를 이용하여
각 시험 참가자의 다음 값을 계산하여라.

- Participant_ID
- 실제 MBTI
- 예측 MBTI
- 최대 예측확률
- 두 번째 예측 MBTI
- 두 번째 예측확률
- 1순위와 2순위 확률 차이
- 예측 엔트로피
- 정답 여부

다음 사례를 추출하여라.

- 확신도가 높은 정답 사례
- 확신도가 낮은 정답 사례
- 확신도가 높은 오분류 사례
- 최대 확률이 0.50 미만인 사례
- 1순위와 2순위 확률 차이가 작은 사례

이를 심리적 진단이나 성격의 확정으로 해석하지 말고,
분류모형의 불확실성으로 해석하여라.

────────────────────────────────────
22. LDA와 QDA 성능 차이 검정
────────────────────────────────────

동일한 시험 참가자에 대해 LDA와 QDA의 정답 여부를 비교하여
McNemar 검정을 수행하여라.

다음 2×2 대응표를 제시하여라.

- LDA와 QDA 모두 정답
- LDA만 정답
- QDA만 정답
- LDA와 QDA 모두 오답

다음을 제시하여라.

- McNemar 검정 방법
- 검정통계량
- 정확한 p값 또는 연속성 보정 p값
- Accuracy 차이가 통계적으로 유의한지
- 시험 표본 수가 작을 경우 검정력의 한계

────────────────────────────────────
23. LDA 판별축 시각화
────────────────────────────────────

최적 LDA 모형이 판별축 변환을 지원하면
첫 번째와 두 번째 판별축을 이용한 산점도를 작성하여라.

다음을 포함하여라.

- LD1
- LD2
- MBTI 유형별 점
- 클래스별 중심점
- 판별축 설명비율
- 범례

유형이 16개라 그래프가 복잡하면 다음을 적용하여라.

- 중심점에만 MBTI 라벨 표시
- 범례를 그래프 외부에 배치
- 주요 오분류 유형만 강조
- 필요한 경우 축별 집단 시각화를 추가

────────────────────────────────────
24. 변수 영향 분석
────────────────────────────────────

LDA와 QDA는 트리모형과 같은 단일 변수 중요도를 직접 제공하지 않으므로,
다음 방법으로 변수 영향을 분석하여라.

- LDA 판별축 loading 또는 scalings
- LDA 계수
- Permutation Importance
- 변수 제거 전후 성능 비교
- 모형 A, B, C 성능 비교

Permutation Importance는 시험 데이터 또는
교차검증 기반으로 계산하고,
평가지표는 Macro F1 또는 Accuracy를 사용하여라.

다음을 해석하여라.

- 어떤 변수가 MBTI 유형 분류에 가장 크게 기여하는가?
- 각 원점수가 예상 MBTI 축과 일관된 역할을 하는가?
- 파생변수 4개가 성능을 실제로 개선하는가?
- Age와 Gender가 추가적인 예측력을 제공하는가?
- 인구통계 변수의 포함이 편향을 유발할 가능성은 없는가?

────────────────────────────────────
25. 변수구성별 성능 비교
────────────────────────────────────

다음 형식으로 LDA와 QDA의 변수구성별 결과를 비교하여라.

| 알고리즘 | 변수구성 | 하이퍼파라미터 | CV Accuracy | CV Macro F1 | Test Accuracy | Test Macro F1 |
|----------|----------|----------------|-------------|-------------|---------------|---------------|

다음을 판단하여라.

1. 파생변수 추가로 성능이 향상되는가?
2. 향상 폭이 교차검증 표준편차보다 충분히 큰가?
3. 파생변수 추가로 QDA가 불안정해지는가?
4. Age와 Gender가 실질적 성능 개선을 제공하는가?
5. 가장 단순하면서도 충분한 성능을 가진 모형은 무엇인가?

성능 차이가 매우 작으면
변수가 적고 해석하기 쉬운 모형을 우선 권장하여라.

────────────────────────────────────
26. 선택적 보조 분석: MBTI 축별 이진 판별
────────────────────────────────────

16개 유형 분류가 불안정하거나 Accuracy가 낮으면
보조 분석으로 다음 네 개의 이진 분류를 수행하여라.

- E vs I
- S vs N
- T vs F
- J vs P

각 축별로 LDA와 QDA를 수행하고 다음을 제시하여라.

- Accuracy
- Balanced Accuracy
- Precision
- Recall
- F1-score
- ROC-AUC
- 혼동행렬

각 축에 직접 대응하는 변수만 사용한 모형과
전체 변수를 사용한 모형을 비교할 수 있다.

예:

- E/I: Social_Energy, Reflection_Time
- S/N: Sensing_Detail, Intuition_Vision
- T/F: Logic_Score, Empathy_Score
- J/P: Structure_Preference, Spontaneity

이 분석은 16개 유형 분류를 대체하는 것이 아니라
어떤 축이 잘 구분되는지를 확인하는 보조 분석임을 명시하여라.

────────────────────────────────────
27. 최종 권장모형 선정
────────────────────────────────────

Best LDA와 Best QDA를 비교하여 최종 권장모형을 선정하여라.

다음 기준을 종합하여 판단하여라.

- 시험 Accuracy
- 시험 Balanced Accuracy
- 시험 Macro F1
- 교차검증 평균성능
- 교차검증 표준편차
- 유형별 성능 균형
- 수치 안정성
- 과적합 가능성
- 모형 해석 가능성
- 변수 수
- 예측확률의 안정성
- McNemar 검정 결과

QDA의 학습 또는 교차검증 성능이 높지만 시험성능이 낮으면
클래스별 공분산행렬을 과도하게 적합한 과적합 가능성을 설명하여라.

LDA의 성능이 QDA와 거의 같으면
보다 단순하고 안정적인 LDA를 우선 권장할 수 있다.

최종적으로 다음을 명확하게 제시하여라.

- 최종 권장 알고리즘
- 최종 변수구성
- 최종 하이퍼파라미터
- Test Accuracy
- Test Balanced Accuracy
- Test Macro F1
- 선정 근거

────────────────────────────────────
28. 분석의 한계
────────────────────────────────────

다음 한계를 실제 분석 결과에 맞게 설명하여라.

- 전체 표본 수 대비 MBTI 16개 유형 수가 많음
- 일부 유형의 표본 수 부족
- QDA 공분산행렬 추정 불안정
- MBTI가 성향점수에서 규칙적으로 생성되었을 가능성
- 파생변수에 의한 정보중복
- Age와 Gender에 따른 편향 가능성
- 단일 데이터셋에 대한 내부검증이라는 한계
- 외부검증 데이터 부재
- MBTI 유형 자체의 측정 안정성 문제
- Accuracy가 심리적·임상적 타당성을 의미하지 않음
- 예측모형 결과를 개인의 성격을 확정하는 진단으로 사용할 수 없음

────────────────────────────────────
29. 최종 결과표
────────────────────────────────────

시험 데이터 예측결과표에는 다음 변수를 포함하여라.

- Participant_ID
- Actual_MBTI
- LDA_Predicted_MBTI
- LDA_Correct
- LDA_Max_Probability
- LDA_Second_Prediction
- LDA_Second_Probability
- LDA_Probability_Gap
- LDA_Matched_Axes
- QDA_Predicted_MBTI
- QDA_Correct
- QDA_Max_Probability
- QDA_Second_Prediction
- QDA_Second_Probability
- QDA_Probability_Gap
- QDA_Matched_Axes

다음 파일을 생성하여라.

- mbti_lda_qda_test_predictions.csv
- mbti_lda_qda_test_predictions.xlsx
- mbti_lda_qda_model_comparison.csv
- mbti_lda_qda_model_comparison.xlsx
- mbti_class_performance.csv
- mbti_class_performance.xlsx
- mbti_axis_performance.csv
- mbti_axis_performance.xlsx
- mbti_prediction_uncertainty.csv
- mbti_prediction_uncertainty.xlsx

────────────────────────────────────
30. 저장할 그래프
────────────────────────────────────

다음 그래프를 각각 PNG 파일로 저장하여라.

1. mbti_class_distribution.png
2. predictor_histograms.png
3. predictor_boxplots.png
4. correlation_heatmap.png
5. lda_confusion_matrix_counts.png
6. lda_confusion_matrix_normalized.png
7. qda_confusion_matrix_counts.png
8. qda_confusion_matrix_normalized.png
9. model_accuracy_comparison.png
10. model_balanced_accuracy_comparison.png
11. model_macro_f1_comparison.png
12. mbti_class_f1_comparison.png
13. mbti_axis_accuracy_comparison.png
14. lda_discriminant_plot.png
15. permutation_importance_lda.png
16. permutation_importance_qda.png
17. prediction_confidence_distribution.png
18. qda_reg_param_performance.png

모든 그래프에는 다음을 포함하여라.

- 명확한 제목
- 축 이름
- 평가값 또는 단위
- 범례
- 실제 표본 수
- 가독성 있는 글자 크기

한글 폰트가 없으면 실행환경의 폰트를 자동 탐색하거나
영문 제목을 사용하여라.

폰트 문제로 전체 분석을 중단하지 마라.

────────────────────────────────────
31. Python 코드 요구사항
────────────────────────────────────

전체 Python 코드는 처음부터 끝까지 한 번에 실행할 수 있도록 작성하여라.

주요 라이브러리는 다음을 사용할 수 있다.

- pandas
- numpy
- matplotlib
- scipy
- scikit-learn
- statsmodels
- openpyxl

필요한 경우 다음을 사용할 수 있다.

- seaborn
- pingouin
- statsmodels
- factor_analyzer

설치되지 않은 선택적 패키지가 있으면
해당 패키지 없이 실행할 수 있는 대체 코드를 우선 작성하여라.

Python 코드에는 다음 기능을 모두 포함하여라.

- CSV 및 Excel 파일 자동 탐색
- CSV 인코딩 오류 대응
- Excel sheet 확인
- 변수명 정리
- 필수 변수 검증
- 수치형 변환
- 결측치 및 무한대 처리
- MBTI 값 정리
- 잘못된 MBTI 유형 확인
- 기술통계
- 클래스 분포
- 상관계수
- VIF
- train/test stratified split
- ColumnTransformer
- Pipeline
- SimpleImputer
- StandardScaler
- OneHotEncoder
- RepeatedStratifiedKFold
- 기본 LDA
- Shrinkage LDA
- QDA reg_param 탐색
- 교차검증
- 다중 평가척도
- 혼동행렬
- classification report
- Top-k Accuracy
- MBTI 축별 정확도
- 예측확률
- 예측 엔트로피
- McNemar 검정
- LDA 판별축 시각화
- Permutation Importance
- 결과표 저장
- 그래프 저장
- random_state=42
- 오류 및 경고 처리

코드의 주요 단계마다 한국어 주석을 작성하여라.

────────────────────────────────────
32. 오류 처리
────────────────────────────────────

실행 중 다음 문제가 발생하면 오류 메시지만 제시하고 종료하지 마라.

- stratified split 실패
- 최소 클래스 표본 부족
- variables are collinear
- covariance matrix is singular
- covariance is not full rank
- NaN 예측확률
- 무한대 로그손실
- 일부 MBTI 클래스 미예측
- OneHotEncoder 버전 차이
- shrinkage와 solver 조합 오류
- QDA 수치 불안정
- 그래프 폰트 오류
- 파일 저장 오류

오류의 원인을 확인하고 다음과 같이 합리적으로 수정하여라.

- 교차검증 fold 수 자동 조정
- QDA reg_param 증가
- 중복 또는 완전 선형종속 변수 제외
- 변수구성 A로 축소
- Pipeline 구성 수정
- 예측확률 clipping
- 사용 가능한 인코더 옵션 적용
- 폰트 자동 대체

수정한 내용과 이유를 명확하게 보고하고 다시 실행하여라.

────────────────────────────────────
33. Python 실제 실행 의무
────────────────────────────────────

중요: Python 코드를 제시한 것만으로 분석을 완료한 것으로 간주하지 마라.

반드시 다음 순서로 수행하여라.

1. 전체 Python 코드를 작성한다.
2. Python 실행 환경에서 실제로 실행한다.
3. 오류가 발생하면 원인을 수정한다.
4. 수정한 코드를 다시 실행한다.
5. 최종적으로 정상 실행된 결과를 확인한다.
6. 출력된 수치, 표, 혼동행렬 및 그래프를 근거로 해석한다.
7. 생성된 결과파일이 실제로 존재하는지 확인한다.

최종 결론은 오직 Python에서 실제로 산출된 결과만을 근거로 작성하여라.

실행하지 않은 결과를 추정하거나,
코드상으로 예상되는 수치를 실제 결과처럼 제시하지 마라.

────────────────────────────────────
34. 실제 실행 후 확인사항
────────────────────────────────────

Python 실행 후 다음을 반드시 확인하여라.

- 실제 분석 파일명
- 전체 표본 수
- 최종 분석 표본 수
- 실제 MBTI 클래스 수
- 유형별 최소·최대 표본 수
- 학습 및 시험 표본 수
- 최적 LDA 변수구성
- 최적 LDA solver와 shrinkage
- 최적 QDA 변수구성
- 최적 QDA reg_param
- LDA 시험 Accuracy
- QDA 시험 Accuracy
- LDA 시험 Balanced Accuracy
- QDA 시험 Balanced Accuracy
- LDA 시험 Macro F1
- QDA 시험 Macro F1
- McNemar 검정 결과
- 가장 잘 분류된 MBTI 유형
- 가장 낮은 성능의 MBTI 유형
- 가장 자주 혼동된 유형쌍
- 가장 정확도가 높은 MBTI 축
- 가장 정확도가 낮은 MBTI 축
- 파생변수 추가 효과
- Age와 Gender 추가 효과
- 최종 권장모형

각 결과를 실제 실행된 숫자로 제시하여라.

────────────────────────────────────
35. 최종 답변 출력 순서
────────────────────────────────────

최종 답변은 반드시 다음 순서로 작성하여라.

① 분석 목적  
② 변수 구성과 제외변수  
③ 정보 누수 및 파생변수 점검  
④ 데이터 품질 점검  
⑤ MBTI 클래스 분포  
⑥ 학습·시험 데이터 분리  
⑦ 전처리 방법  
⑧ LDA·QDA 가정 점검  
⑨ LDA 교차검증 결과  
⑩ QDA 교차검증 및 reg_param 결과  
⑪ 최적 LDA와 최적 QDA 선정  
⑫ 시험 데이터 최종 성능  
⑬ Accuracy·Balanced Accuracy·Macro F1 비교  
⑭ 혼동행렬  
⑮ MBTI 유형별 성능  
⑯ MBTI 네 축별 정확도  
⑰ 예측확률 및 불확실성  
⑱ McNemar 검정  
⑲ 변수 영향 및 파생변수 효과  
⑳ 최종 권장모형  
㉑ 분석의 한계  
㉒ 전체 Python 코드  
㉓ 실제 Python 실행 결과  
㉔ 생성된 표와 그래프  
㉕ 다운로드 가능한 CSV·Excel·PNG 파일

각 단계에서는 다음을 구분하여 작성하여라.

- 분석 목적
- 분석 방법
- 실제 Python 실행 결과
- 통계적 해석
- 실무적 의미

코드 실행 전에는 분석 결과를 예측하거나 단정하지 마라.
모든 수치와 해석은 첨부한 실제 데이터로 Python을 실행한 후 작성하여라.